
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Helper class for managing a table lock.
//
///////////////////////////////////////////////////////////////////////////////

#include "Database/PostgreSQL/Lock.h"
#include "Database/PostgreSQL/Connection.h"

using namespace Database::PostgreSQL;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor
//
///////////////////////////////////////////////////////////////////////////////

Lock::Lock ( Connection &c, 
	     const std::string &table, 
	     const std::string &mode ) :
  _c ( c ),
  _table ( table ),
  _mode ( mode )
{
  // "The keyword TRANSACTION is just a cosmetic alternative to WORK. 
  // Neither keyword need be specified."
  // http://www.postgresql.org/docs/6.4/static/sql-beginwork.htm
  _c.execute ( "begin" );
  _c.execute ( "lock table " + _table + " in " + _mode + " mode" );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor
//
///////////////////////////////////////////////////////////////////////////////

Lock::~Lock()
{
  _c.execute ( "rollback" );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Commit the transaction.
//
///////////////////////////////////////////////////////////////////////////////

void Lock::commit()
{
  _c.execute ( "commit" );
}
